package org.xx.armory.db;

import java.math.BigDecimal;
import java.util.Date;

/**
 * 从数据库中查询的一条记录。
 * <p>所有的get方法都应当先通过{@link #hasData()}方法判断是否可以获取数据，否则可能抛出{@link DbException}异常。</p>
 *
 * @author Haart
 */
public interface DbRow {
    /**
     * 获取记录的指定列数据，以字符串的形式返回。
     *
     * @param index
     *         列序号(从0开始)。
     * @return 该列的数据, 如果参数{@code index}超过或等于列数则返回{@code null}。
     * @see #hasData()
     */
    String getString(
            int index
    );

    /**
     * 获取记录的指定列数据，以整数的形式返回。
     *
     * @param index
     *         列序号(从0开始)。
     * @return 该列的数据, 如果参数{@code index}超过或等于列数则返回{@code null}。
     * @see #hasData()
     */
    Integer getInteger(
            int index
    );

    /**
     * 获取记录的指定列数据，以长整数的形式返回。
     *
     * @param index
     *         列序号(从0开始)。
     * @return 该列的数据, 如果参数{@code index}超过或等于列数则返回{@code null}。
     * @see #hasData()
     */
    Long getLong(
            int index
    );

    /**
     * 获取记录的指定列数据，以{@code BigDecimal}的形式返回。
     *
     * @param index
     *         列序号(从0开始)。
     * @return 该列的数据, 如果参数{@code index}超过或等于列数则返回{@code null}。
     * @see #hasData()
     */
    BigDecimal getDecimal(
            int index
    );

    /**
     * 获取记录的指定列数据，以双精度的形式返回。
     *
     * @param index
     *         列序号(从0开始)。
     * @return 该列的数据, 如果参数{@code index}超过或等于列数则返回{@code null}。
     * @see #hasData()
     */
    Double getDouble(
            int index
    );

    /**
     * 获取记录的指定列数据，以日期的形式返回。
     *
     * @param index
     *         列序号(从0开始)。
     * @return 该列的数据, 如果参数{@code index}超过或等于列数则返回{@code null}。
     * @see #hasData()
     */
    Date getDate(
            int index
    );

    /**
     * 获取记录的指定列数据，以布尔值的形式返回。
     *
     * @param index
     *         列序号(从0开始)。
     * @return 该列的数据, 如果参数{@code index}超过或等于列数则返回{@code null}。
     * @see #hasData()
     */
    Boolean getBoolean(
            int index
    );

    /**
     * 获取记录的指定列数据，以字节数组的形式返回。
     *
     * @param index
     *         列序号(从0开始)。
     * @return 该列的数据, 如果参数{@code index}超过或等于列数则返回{@code null}。
     * @see #hasData()
     */
    byte[] getBinary(
            int index
    );

    /**
     * 获取记录的指定列数据，以一般对象的形式返回。
     *
     * @param index
     *         列序号(从0开始)。
     * @return 该列的数据, 如果参数{@code index}超过或等于列数则返回{@code null}。
     * @see #hasData()
     */
    Object getObject(
            int index
    );

    /**
     * 获取记录的列数。
     *
     * @return 记录的列数。
     */
    int length();

    /**
     * 判断是否可以获取数据。
     *
     * @return 是否可以获取数据。
     */
    boolean hasData();

    /**
     * 获取下一个记录。
     *
     * @throws DbException
     *         如果获取下一个记录出错。
     */
    void next();
}
